package InputStream;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author 王艺锡
 * @version 1.0
 * FileInputStream以字节的形式读取文件
 */
public class FileInputStream_ {
    public static void main(String[] args) {

    }

    /**
     * 读取文件
     * 单个字节的读取，效率比较低
     */

    @Test
    public void readFile01() {
        String filePath = "e:\\hello.txt";
        FileInputStream fileInputStream = null;
        int readData = 0;
        try {
            //创建FileInputStream对象，用于读取文件
            fileInputStream = new FileInputStream(filePath);

            //每次从该文件读取一个字节的数据，如果返回值为-1，则表示读取完毕
            while ((readData = fileInputStream.read()) != -1){
                System.out.print((char) readData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭文件流，释放资源
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     * 读取文件
     * 使用字节数组读取文件，提高效率
     */

    @Test
    public void readFile02() {
        String filePath = "e:\\hello.txt";
        FileInputStream fileInputStream = null;
        byte buf[] = new byte[8];
        int readLen = 0;
        try {
            //创建FileInputStream对象，用于读取文件
            fileInputStream = new FileInputStream(filePath);

            //每次从该文件读取buf.length个字节的数据到字节数组
            //如果有数据，则每次读取最多buf.length个字节的数据到字节数组，并且返回对应字节个数的int值
            //如果读取完毕，则返回-1
            while ((readLen = fileInputStream.read(buf)) != -1){
                //readLen第一次读取8个字符，返回8，第二次读取3个字符，返回3，第三次读取完毕返回-1
                System.out.print(new String(buf,0,readLen));//
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭文件流，释放资源
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
